home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / dev / e / cha_source.lha / cha_source / polynomial.e < prev    next >
Encoding:
Text File  |  1999-12-18  |  2.2 KB  |  71 lines

  1. /*==========================================================================+
  2. | polynomial.e                                                              |
  3. | polynomials of complex numbers                                            |
  4. | NB: OBJECT polynomial allows up to 256 poles/zeros in filters             |
  5. +--------------------------------------------------------------------------*/
  6.  
  7. OPT MODULE
  8.  
  9. MODULE '*complex'
  10.  
  11. /*-------------------------------------------------------------------------*/
  12.  
  13. EXPORT OBJECT polynomial
  14.     power    : LONG
  15.     c[257]   : ARRAY OF complex
  16. ENDOBJECT
  17.  
  18. /*-------------------------------------------------------------------------*/
  19.  
  20. -> constructors (note - these do not depend on the object being cleared, so
  21. -> the same allocated object can be reused, for efficiency)
  22.  
  23. -> empty polynomial
  24. PROC polynomial() OF polynomial
  25.     DEF i : LONG, c : PTR TO complex
  26.     self.power := 0
  27.     c := self.c
  28.     ccopy([1.0,0.0]:complex, c++)
  29.     FOR i := 1 TO 256 DO ccopy([0.0,0.0]:complex,c++) -> NB: to length-1
  30. ENDPROC
  31.  
  32. -> made up of zeros
  33. PROC expand(zeros : LONG, zeroarray : PTR TO complex) OF polynomial
  34.     DEF i : LONG
  35.     self.polynomial()
  36.     FOR i := 1 TO zeros DO self.addzero(zeroarray++)
  37. ENDPROC
  38.  
  39. /*-------------------------------------------------------------------------*/
  40.  
  41. -> add a zero at z=w (multiply by (z-w))
  42.  
  43. PROC addzero(w : PTR TO complex) OF polynomial
  44.     DEF t : complex, i : LONG, c : PTR TO complex
  45.     c := self.c
  46.     FOR i := self.power + 1 TO 1 STEP -1 DO csub(c[i-1],cmul(w,c[i],t),c[i])
  47.     cmul(cneg(w,t),c[0],c[0])
  48.     self.power := self.power + 1
  49. ENDPROC
  50.  
  51. -> evaluate polynomial at z=w; to can be same as w
  52.  
  53. PROC evaluate(w : PTR TO complex, to : PTR TO complex) OF polynomial
  54.     DEF c : PTR TO complex, ww : complex, i : LONG
  55.     -> sum(c[n] z^n) = (c[n] z + c[n-1]) z +... + c[0]
  56.     c := self.c
  57.     ccopy(w,ww)
  58.     ccopy(c[self.power], to)
  59.     FOR i := self.power TO 1 STEP -1 DO cadd(cmul(to,ww,to),c[i-1],to)
  60. ENDPROC to
  61.  
  62. /*-------------------------------------------------------------------------*/
  63.  
  64. -> destructor
  65.  
  66. PROC end() OF polynomial IS EMPTY
  67.  
  68. /*--------------------------------------------------------------------------+
  69. | END: polynomial.e                                                         |
  70. +==========================================================================*/
  71.